/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.inventario.dao;

import br.com.inventario.Inventario;
import br.com.inventario.util.FabricaConexoes;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Diogo, Gilvan, Lélandi e Lucas
 */
public class InventarioDAO implements IInventarioDAO {

    private Connection conexao;

    public InventarioDAO() throws InventarioDAOException {
        try {
            this.conexao = FabricaConexoes.getConnection();
        } catch (Exception e) {
            throw new InventarioDAOException("Erro - " + e.getMessage());
        }
    }

    @Override
    public List<Inventario> select() throws InventarioDAOException {
        Connection conexaoLocal = null;
        PreparedStatement statementSelect = null;
        ResultSet rs = null;
        String SQL = "SELECT * FROM equipamento, categoria, fornecedor, localizacao "
                + "WHERE (equipamento.categoria=categoria.cat_id)AND(equipamento.fornecedor=fornecedor.forn_id)"
                + "AND(equipamento.localizacao=localizacao.loc_id)AND(equipamento.tipo!='BAIXADO') ORDER BY numeroSerie";
        List<Inventario> listaInventario = new ArrayList<Inventario>();
        try {
            conexaoLocal = this.conexao;
            statementSelect = conexaoLocal.prepareStatement(SQL);
            rs = statementSelect.executeQuery();
            while (rs.next()) {
                Inventario objeto = new Inventario();
                objeto.setNumeroSerie(rs.getInt("numeroSerie"));
                objeto.setNome(rs.getString("nome"));
                objeto.setDescricao(rs.getString("descricao"));
                objeto.setFabricante(rs.getString("fabricante"));
                objeto.setMarca(rs.getString("marca"));
                objeto.setModelo(rs.getString("modelo"));
                objeto.setEndIp(rs.getString("enderecoIP"));
                objeto.setTipo(rs.getString("tipo"));
                objeto.setDtCompra(rs.getDate("dataCompra"));
                objeto.setValorCompra(rs.getDouble("valorCompra"));
                objeto.setCategoria(rs.getString("cat_tipo"));
                objeto.setFornecedor(rs.getString("forn_nome"));
                objeto.setLocalizacao(rs.getString("loc_local"));
                objeto.setSistemaOperacional(rs.getString("sistemaOperacional"));
                objeto.setAplicativo(rs.getString("aplicativo"));
                objeto.setSoftServico(rs.getString("softServico"));
                listaInventario.add(objeto);
            }
        } catch (SQLException e) {
            System.out.println("Erro na consulta:" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, statementSelect, rs);
        }
        return listaInventario;
    }
    
    @Override
    public List<Inventario> select2() throws InventarioDAOException {
        Connection conexaoLocal = null;
        PreparedStatement statementSelect = null;
        ResultSet rs = null;
        String SQL = "SELECT * FROM equipamento, categoria, fornecedor, localizacao "
                + "WHERE (equipamento.categoria=categoria.cat_id)AND(equipamento.fornecedor=fornecedor.forn_id)"
                + "AND(equipamento.localizacao=localizacao.loc_id)AND(equipamento.tipo='BAIXADO') ORDER BY numeroSerie";
        List<Inventario> listaInventario = new ArrayList<Inventario>();
        try {
            conexaoLocal = this.conexao;
            statementSelect = conexaoLocal.prepareStatement(SQL);
            rs = statementSelect.executeQuery();
            while (rs.next()) {
                Inventario objeto = new Inventario();
                objeto.setNumeroSerie(rs.getInt("numeroSerie"));
                objeto.setNome(rs.getString("nome"));
                objeto.setDescricao(rs.getString("descricao"));
                objeto.setFabricante(rs.getString("fabricante"));
                objeto.setMarca(rs.getString("marca"));
                objeto.setModelo(rs.getString("modelo"));
                objeto.setEndIp(rs.getString("enderecoIP"));
                objeto.setTipo(rs.getString("tipo"));
                objeto.setDtCompra(rs.getDate("dataCompra"));
                objeto.setValorCompra(rs.getDouble("valorCompra"));
                objeto.setCategoria(rs.getString("cat_tipo"));
                objeto.setFornecedor(rs.getString("forn_nome"));
                objeto.setLocalizacao(rs.getString("loc_local"));
                objeto.setSistemaOperacional(rs.getString("sistemaOperacional"));
                objeto.setAplicativo(rs.getString("aplicativo"));
                objeto.setSoftServico(rs.getString("softServico"));
                listaInventario.add(objeto);
            }
        } catch (SQLException e) {
            System.out.println("Erro na consulta:" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, statementSelect, rs);
        }
        return listaInventario;
    }

    @Override
    public void gravarItem(Inventario objeto) throws InventarioDAOException {
        int cat_id;
        int forn_id;
        int loc_id;
        PreparedStatement pstm = null;
        Connection conexaoLocal = null;
        String SQL = "INSERT INTO equipamento (numeroSerie, nome, descricao, fabricante, marca, "
                + " modelo, enderecoIP, tipo, dataCompra, valorCompra, categoria, fornecedor,"
                + "localizacao, sistemaOperacional, aplicativo, softServico) "
                + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ";
        try {
            conexaoLocal = this.conexao;
            pstm = conexaoLocal.prepareStatement(SQL);
            cat_id = Integer.parseInt(objeto.getCategoria());
            forn_id = Integer.parseInt(objeto.getFornecedor());
            loc_id = Integer.parseInt(objeto.getLocalizacao());
            pstm.setInt(1, objeto.getNumeroSerie());
            pstm.setString(2, objeto.getNome());
            pstm.setString(3, objeto.getDescricao());
            pstm.setString(4, objeto.getFabricante());
            pstm.setString(5, objeto.getMarca());
            pstm.setString(6, objeto.getModelo());
            pstm.setString(7, objeto.getEndIp());
            pstm.setString(8, objeto.getTipo());
            pstm.setDate(9, new java.sql.Date(objeto.getDtCompra().getTime()));
            pstm.setDouble(10, objeto.getValorCompra());
            pstm.setInt(11, cat_id);
            pstm.setInt(12, forn_id);
            pstm.setInt(13, loc_id);
            pstm.setString(14, objeto.getSistemaOperacional());
            pstm.setString(15, objeto.getAplicativo());
            pstm.setString(16, objeto.getSoftServico());
            pstm.executeUpdate();
        } catch (SQLException e) {
            throw new InventarioDAOException("Erro ao incluir o item" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, pstm);
        }
    }

    @Override
    public void excluirAtivo(Inventario inventario) throws InventarioDAOException {
        PreparedStatement pstm = null;
        Connection conexaoLocal = null;
        String SQL = "DELETE FROM equipamento WHERE numeroSerie = ?";
        try {
            conexaoLocal = this.conexao;
            pstm = conexaoLocal.prepareStatement(SQL);
            pstm.setInt(1, inventario.getNumeroSerie());
            pstm.executeUpdate();
        } catch (SQLException e) {
            throw new InventarioDAOException("Erro ao excluir o item" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, pstm);
        }
    }

    @Override
    public void alterarAtivo(Inventario objInventario) throws InventarioDAOException {
        int cat_id;
        int forn_id;
        int loc_id;
        PreparedStatement pstm = null;
        Connection conexaoLocal = null;
        String SQL = "UPDATE equipamento SET numeroSerie = ?, nome = ?, descricao = ?,"
                + "fabricante = ?, marca = ?, modelo = ?, enderecoIp = ?, tipo = ?,"
                + "dataCompra = ?, valorCompra = ?, categoria = ?, fornecedor = ?,"
                + "localizacao = ?, sistemaOperacional = ?, aplicativo = ?, softServico = ?"
                + " WHERE numeroSerie = ?";
        try {
            conexaoLocal = this.conexao;
            pstm = conexaoLocal.prepareStatement(SQL);
            cat_id = Integer.parseInt(objInventario.getCategoria());
            forn_id = Integer.parseInt(objInventario.getFornecedor());
            loc_id = Integer.parseInt(objInventario.getLocalizacao());
            pstm.setInt(1, objInventario.getNumeroSerie());
            pstm.setString(2, objInventario.getNome());
            pstm.setString(3, objInventario.getDescricao());
            pstm.setString(4, objInventario.getFabricante());
            pstm.setString(5, objInventario.getMarca());
            pstm.setString(6, objInventario.getModelo());
            pstm.setString(7, objInventario.getEndIp());
            pstm.setString(8, objInventario.getTipo());
            pstm.setDate(9, new java.sql.Date(objInventario.getDtCompra().getTime()));
            pstm.setDouble(10, objInventario.getValorCompra());
            pstm.setInt(11, cat_id);
            pstm.setInt(12, forn_id);
            pstm.setInt(13, loc_id);
            pstm.setString(14, objInventario.getSistemaOperacional());
            pstm.setString(15, objInventario.getAplicativo());
            pstm.setString(16, objInventario.getSoftServico());
            pstm.setInt(17, objInventario.getNumeroSerie());
            pstm.executeUpdate();
        } catch (SQLException e) {
            throw new InventarioDAOException("Erro ao editar item" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, pstm);
        }
    }

    @Override
    public void venderAtivo(Inventario objInventario) throws InventarioDAOException {
        int cat_id;
        int forn_id;
        int loc_id;
        PreparedStatement pstm = null;
        Connection conexaoLocal = null;
        String SQL = "UPDATE equipamento SET numeroSerie = ?, nome = ?, descricao = ?,"
                + "fabricante = ?, marca = ?, modelo = ?, enderecoIp = ?, tipo = ?,"
                + "dataCompra = ?, valorCompra = ?, categoria = ?, fornecedor = ?,"
                + "localizacao = ?, sistemaOperacional = ?, aplicativo = ?, softServico = ?"
                + " WHERE numeroSerie = ?";
        try {
            conexaoLocal = this.conexao;
            pstm = conexaoLocal.prepareStatement(SQL);
            cat_id = Integer.parseInt(objInventario.getCategoria());
            forn_id = Integer.parseInt(objInventario.getFornecedor());
            loc_id = Integer.parseInt(objInventario.getLocalizacao());
            pstm.setInt(1, objInventario.getNumeroSerie());
            pstm.setString(2, objInventario.getNome());
            pstm.setString(3, objInventario.getDescricao());
            pstm.setString(4, objInventario.getFabricante());
            pstm.setString(5, objInventario.getMarca());
            pstm.setString(6, objInventario.getModelo());
            pstm.setString(7, objInventario.getEndIp());
            pstm.setString(8, objInventario.getTipo());
            pstm.setDate(9, new java.sql.Date(objInventario.getDtCompra().getTime()));
            pstm.setDouble(10, objInventario.getValorCompra());
            pstm.setInt(11, cat_id);
            pstm.setInt(12, forn_id);
            pstm.setInt(13, loc_id);
            pstm.setString(14, objInventario.getSistemaOperacional());
            pstm.setString(15, objInventario.getAplicativo());
            pstm.setString(16, objInventario.getSoftServico());
            pstm.setInt(17, objInventario.getNumeroSerie());
            pstm.executeUpdate();
        } catch (SQLException e) {
            throw new InventarioDAOException("Erro ao vender item" + e);
        } finally {
            FabricaConexoes.fecharConexao(conexaoLocal, pstm);
        }
    }
}
